package aterrizar.test;

import org.junit.Test;

import utils.Rango;
import utils.exceptions.RangoRecibioDesdeDespuesQueHastaException;

import aterrizar.Anticipacion;
import aterrizar.Clase;
import aterrizar.PrecioDeVuelo;
import aterrizar.Vuelo;
import aterrizar.exceptions.PrecioConflictuaException;
import aterrizar.exceptions.PrecioNoEnElConjuntoException;

import junit.framework.TestCase;

public class AdministrarPreciosDeVuelos extends TestCase {

	/**
	 * Este test pretende probar el agregado de un precio a un vuelo que no tiene ningun precio.
	 * El agregado debe ser exitoso porque no hay posibilidad de conflictos,
	 * luego se pretende obtener un precio para la misma clase y una anticipacion compatible con la dada.
	 * El precio obtenido y el agregado deben ser iguales.
	 */
	@Test
	public void testAgregarPrecioAUnVuelo() throws PrecioConflictuaException, RangoRecibioDesdeDespuesQueHastaException {
		Anticipacion anticipacionDesde = new Anticipacion(0);
		Anticipacion anticipacionHasta = new Anticipacion(15);
		Rango<Anticipacion> rangoAnticipacion = new Rango<Anticipacion>(anticipacionDesde, anticipacionHasta);
		Clase clase = Clase.Primera;
		Double precio = 50.0;
		PrecioDeVuelo precioDeVuelo = new PrecioDeVuelo(clase, rangoAnticipacion, precio);
		Vuelo vuelo = new Vuelo("AR3007");
		vuelo.agregarPrecio(precioDeVuelo);
		Double precioDeVueloGuardado = vuelo.getPrecio( clase, new Anticipacion(8) );
		assertEquals(precio, precioDeVueloGuardado);
	}
	
	/**
	 * Este test pretende probar el agregado de un precio conflictivo a un vuelo.
	 * Es decir, el vuelo ya tiene un precio para ese clase un rango de anticipacion
	 * que al menos se solapa con el que se quiere agregar.
	 * Se espera un error en el agregado.
	 * @throws PrecioConflictuaException 
	 */
	@Test(expected=PrecioConflictuaException.class)
	public void testAgregarPrecioConflictivoAUnVuelo() throws PrecioConflictuaException, RangoRecibioDesdeDespuesQueHastaException {
		Rango<Anticipacion> rangoAnticipacion = new Rango<Anticipacion>(new Anticipacion(0), new Anticipacion(15));
		Clase clase = Clase.Primera;
		PrecioDeVuelo precio = new PrecioDeVuelo(clase, rangoAnticipacion, 50);
		Vuelo vuelo = new Vuelo("AR3007");
		vuelo.agregarPrecio(precio);
		
		Rango<Anticipacion> rangoAnticipacionConflictiva = new Rango<Anticipacion>(new Anticipacion(10), new Anticipacion(20));
		PrecioDeVuelo precioConflictivo = new PrecioDeVuelo(clase, rangoAnticipacionConflictiva, 50);
		try
		{
			vuelo.agregarPrecio(precioConflictivo);
			fail("Se esperaba PrecioConflictuaException y no fallo");
		}
		catch (PrecioConflictuaException e) {
		}
	}
	
	/**
	 * Este test pretende probar la elimincacion de un precio de Vuelo.
	 * Se comienza por agregar un precio conocido a un vuelo, luego se lo elimina.
	 * Se termina por comprobar que al pedirlo no se obtienen resultados.
	 * @throws PrecioNoEnElConjuntoException 
	 */
	@Test
	public void testBorrarPrecioDeUnVuelo() throws PrecioNoEnElConjuntoException, PrecioConflictuaException, RangoRecibioDesdeDespuesQueHastaException
	{
		Anticipacion anticipacionDesde = new Anticipacion(0);
		Anticipacion anticipacionHasta = new Anticipacion(10);
		Rango<Anticipacion> rangoAnticipacion = new Rango<Anticipacion>(anticipacionDesde, anticipacionHasta);
		Clase clase = Clase.Primera;
		Double precio = 40.0;
		PrecioDeVuelo precioDeVuelo = new PrecioDeVuelo(clase, rangoAnticipacion, precio);
		Vuelo vuelo = new Vuelo("AR3007");
		vuelo.agregarPrecio(precioDeVuelo);

		vuelo.eliminarPrecio( clase, rangoAnticipacion );
		Double precioBorrado = vuelo.getPrecio( clase, new Anticipacion(5));
		
		assertNull(precioBorrado);
	}
	
	/**
	 * Este test pretende probar que cuando se intenta eliminar de un Vuelo un precio
	 * que no existe, dado que el unico similar tiene un rango distinto, la eliminacion fallara 
	 */
	@Test(expected=PrecioNoEnElConjuntoException.class)
	public void testBorrarPrecioConOtraAnticipacionDeUnVuelo() throws PrecioConflictuaException, RangoRecibioDesdeDespuesQueHastaException
	{
		Anticipacion anticipacionDesde = new Anticipacion(0);
		Anticipacion anticipacionHasta = new Anticipacion(10);
		Rango<Anticipacion> rangoAnticipacion = new Rango<Anticipacion>(anticipacionDesde, anticipacionHasta);
		Clase clase = Clase.Primera;
		PrecioDeVuelo precio = new PrecioDeVuelo(clase, rangoAnticipacion, 40);
		Vuelo vuelo = new Vuelo("AR3007");
		vuelo.agregarPrecio(precio);

		Rango<Anticipacion> rangoAnticipacionNueva = new Rango<Anticipacion>(new Anticipacion(0), new Anticipacion(8));
		try
		{
			vuelo.eliminarPrecio( clase, rangoAnticipacionNueva );
			fail("Se esperaba PrecioNoEnElConjuntoException y no fallo");
		}
		catch (PrecioNoEnElConjuntoException e) {
		}
	}
}
